1
Nozioni di base su avenue.quark
Sono in molti a voler usare il Web per pubblicare informazioni create con QuarkXPress Passport™ , e di conseguenza ci sono molti modi per farlo. Il metodo più efficiente consiste tuttavia nel separare il contenuto di tali documenti QuarkXPress Passport dai documenti stessi, salvandolo in un formato strutturato come il formato XML. Successivamente tale contenuto potrà essere utilizzato non solo per il Web, ma anche in altri formati, ad esempio per la stampa, la distribuzione su CD-ROM, e così via.
Il software avenue.quark™ è stato sviluppato proprio per facilitare l'estrazione del contenuto dai documenti QuarkXPress Passport e la sua memorizzazione in formato XML.
Introduzione all'XML
Avenue.quark consente di estrarre il contenuto dai documenti QuarkXPress Passport e di salvarlo in formato XML. Successivamente tale contenuto può essere utilizzato in molti modi diversi, inclusa la pubblicazione sul Web. La presente sezione descrive in linee generali le procedure e le definizioni relative all'XML; per una descrizione più dettagliata, si rimanda alle sezioni che seguono.
Che cos'è il contenuto
Il contenuto è costituito dalle informazioni che danno valore ai documenti. Ad esempio, il contenuto di una rivista può consistere di articoli, fotografie, interviste e grafici.
Il contenuto può anche essere definito in base a ciò che non è. Ad esempio, intestazioni, piè di pagine e diciture quali "Continua a pagina x" di norma non vengono considerati come facenti parte del contenuto di una rivista. Essi fanno piuttosto parte della presentazione della rivista, ovvero costituiscono caratteristiche utili soltanto quando la rivista viene presentata in forma stampata. La presentazione può variare a seconda del supporto utilizzato per la pubblicazione delle informazioni, mentre di norma il contenuto resta invariato.
Avenue.quark separa il contenuto dalla presentazione estraendolo dai documenti QuarkXPress Passport e salvandolo in formato XML. Il contenuto potrà quindi essere riutilizzato con presentazioni diverse, ad esempio come materiale stampato, sul Web, su CD-ROM, e così via, semplicemente adattandolo di volta in volta alle varie presentazioni.
Che cos'è l'XML?
XML è l'acronimo di Extensible Markup Language (Linguaggio di marcatura estensibile), ossia un linguaggio che permette di specificare la struttura del contenuto e di etichettare in modo significativo i vari componenti di quel contenuto.
Etichettatura del contenuto
Etichettare il contenuto è necessario perché, sebbene gli esseri umani prendendo in mano una rivista siano in grado di capire che una particolare riga di testo è un titolo, un computer non riesce a fare altrettanto con la stessa facilità. L'XML consente di "codificare con tag" le informazioni in un modo comprensibile per il computer così da permettergli di capire che una particolare riga di testo è un titolo e quindi di formattarla automaticamente come tale.
Per etichettare una porzione di contenuto in XML, occorre inserire un tag XML di apertura prima del contenuto e un tag XML di chiusura dopo il contenuto, come nell'esempio seguente:
<titolo>Internet cresce del 400%</titolo>
Come si può osservare, un tag di apertura consiste di un nome dell' elemento racchiuso fra parentesi angolari < e >. Il tag di chiusura è uguale al tag di apertura, con l'unica differenza che dopo la < si deve utilizzare il segno /. In questo caso, il testo "Internet cresce del 400%" è stato "codificato con tag" come titolo inserendolo fra i tag di apertura e chiusura <titolo>.
Identificazione della struttura
Di norma un articolo di cronaca comprende il titolo, il nome dell'autore, il testo principale e alcune foto o diagrammi con didascalie. Il computer tuttavia non è in grado di riconoscere tutti questi elementi finché non vengono interpretati in modo che esso possa capire che cosa sono.
L'XML permette di descrivere la struttura dei documenti per mezzo di un DTD (Definizione del Tipo di Documento). Il DTD serve a specificare che le informazioni contenute in un determinato documento utilizzeranno un particolare insieme di tag e si uniformeranno a un particolare gruppo di regole di struttura. Ad esempio, il DTD per un articolo di cronaca potrebbe specificare che:
* Ogni storia deve avere un <titolo>.
* Ogni storia può comprendere o non comprendere il nome dell' <autore>.
* Ogni storia deve comprendere almeno un <paragrafo>.
* Ogni storia può comprendere o non comprendere degli elementi <illustrazione>.
* Ogni illustrazione deve essere immediatamente seguita da una <didascalia>.
Seguendo scrupolosamente le regole definite dal DTD, un'organizzazione può far sì che tutti i documenti creati siano sempre strutturati secondo un certo modello e in modo coerente. Ciò permette quindi di spostare il contenuto da un supporto a un altro con estrema facilità, ad esempio dal formato stampa al Web, o viceversa.
G L'uso di DTD in avenue.quark è obbligatorio. Per informazioni sulla creazione e l'adattamento dei DTD, consultate le sezioni "Come usare i DTD" e "DTD standard" in questo capitolo.
Un formato "neutro"
XML è un formato "neutro", in quanto non contiene informazioni sulla formattazione. Grazie a ciò, esso può essere utilizzato con una vasta gamma di applicazioni, che possono applicare vari tipi di formattazione quando il contenuto viene presentato in modi diversi.
G Per una trattazione più dettagliata dell'XML, consultate la sezione "Considerazioni generali sull'XML" in questo capitolo.
Che cosa è possibile fare con il contenuto salvato in formato XML?
Il contenuto estratto da un documento QuarkXPress Passport può essere utilizzato in molti modi. Ad esempio, il contenuto codificato con tag XML può essere convertito in modo dinamico nel formato HTML ed essere servito sul Web. Questo metodo di conversione del contenuto di documenti QuarkXPress Passport in HTML è migliore se paragonato alla semplice esportazione in HTML poiché permette di formattare, riformattare e riorganizzare il contenuto con grande facilità.
Considerazioni generali sull'XML
Ora che vi siete fatti un'idea di che cos'è avenue.quark e come funziona, passiamo agli aspetti più pratici, prendendo innanzitutto in esame l'XML.
Il Linguaggio di marcatura estensibile XML costituisce un metodo per definire la struttura dei documenti e per etichettare determinate parti del relativo contenuto con i tag. I controlli strutturali dell'XML consentono di verificare che tutte le porzioni necessarie di un documento siano presenti e si succedano nella sequenza appropriata. L'assegnazione di etichette al contenuto facilita l'utilizzo o la visualizzazione di quel contenuto da parte di altre applicazioni.
Prima di vedere come l'XML permette di realizzare questi obiettivi, tuttavia, soffermiamoci un momento sul perché ciò sia necessario.
I problemi risolti dall'XML
L'XML deriva da un linguaggio di marcatura più vecchio e più complesso denominato SGML (Linguaggio di marcatura standard generalizzato). L'XML è stato creato per risolvere una serie di problemi correlati, alcuni dei quali furono originariamente risolti dall'SGML, ed altri invece sono unici.
Assegnazione di struttura ed etichette alle informazioni
L'XML viene talvolta definito come "metalinguaggio" perché consente di definire dei linguaggi di marcatura personalizzati per usi specifici attraverso la creazione di un DTD (Definizione del Tipo di Documento). Il DTD specifica quale tipo di informazioni possono essere inserite in un documento, come devono essere codificate (ovvero etichettate) le varie porzioni del documento, l'ordine secondo cui esse devono succedersi, e quante ne sono consentite per ogni porzione. Un documento viene ritenuto "valido" secondo un determinato DTD soltanto se è conforme alle regole di quel DTD.
I DTD permettono di predeterminare la struttura dei documenti. Infatti, se a un documento è associata un certo DTD, si sa già che tipo di informazioni verranno visualizzate quando si apre il documento. Grazie ai DTD, inoltre, le informazioni contenute nei documenti XML possono essere facilmente elaborate da un computer in quanto se esso è in grado di "capire" un DTD, sarà in grado di "capire" tutte le informazioni contenute in qualsiasi documento XML che utilizza quel dato DTD. Ad esempio, sulla base del DTD di un documento, un'applicazione potrebbe consentire di eseguire una ricerca nel documento di tutte le istanze di un particolare tipo di informazioni (quale il nome di una società), o di generare una pagina HTML che riporti tutte le istanze di quel tipo di informazioni, come ad esempio un elenco di nomi di società.
Sono già state sviluppati DTD specifici per documenti che utilizzano nozioni di chimica e di matematica, come pure per documenti di natura tecnica e perfino per opere di narrativa. Fra le potenziali applicazioni si annoverano il controllo del flusso di lavoro, la stesura di specifiche di programmi sofware, e praticamente qualsiasi altro settore in cui avvenga uno scambio di informazioni strutturate.
G A differenza del linguaggio SGML, l'XML permette di creare documenti "Ben-Formati", ovvero documenti conformi alle regole dell'XML ma non a un particolare DTD. È tuttavia difficile ottenere documenti sempre coerenti se non si adotta uno standard; di conseguenza, avenue.quark impone l'uso di DTD.
Più facile lavorare in HTML
L'HTML ha dimostrato di essere uno strumento potente e versatile per la visualizzazione delle informazioni sul Web, sebbene presenti due grossi limiti: descrive soltanto la formattazione dei dati, non il loro significato, e non prevede la creazione di nuovi tag HTML.
L'XML risolve entrambi i problemi. Se infatti lo utilizzate per etichettare i dati di un documento XML, potete poi basare la formattazione in HTML su quelle etichette. Si prenda ad esempio un documento XML contenente un elenco di aziende con alcune informazioni su ciascuna di esse. Per trasformare questo elenco in una pagina Web HTML su cui il nome di ogni azienda compaia in grassetto, è sufficiente utilizzare un convertitore XML-HTML indicando di applicare il grassetto a tutte le righe contrassegnate come <nomeAzienda>. In questo modo non occorre più passare in rassegna tutto il documento formattando manualmente il nome di ogni azienda. È facile quindi intuire che il risparmio di tempo per chi si occupa della creazione di siti Web è enorme.
Scambio di informazioni
I programmi per computer sono stati sviluppati da tante persone e organizzazioni diverse per gli usi più disparati; di conseguenza, memorizzano le informazioni utilizzando molti formati diversi. Due società potrebbero ad esempio memorizzare i dati relativi ai clienti in due formati completamente diversi, sebbene le informazioni che entrambe memorizzano (nome, indirizzo, numero di telefono, ecc.) siano di fatto di tipo identico.
L'XML risolve questo tipo di problema offrendo un formato standardizzato e non esclusivo per il trasferimento dei dati fra le applicazioni. L'XML è stato sviluppato, perfezionato e approvato da un gruppo di specialisti appartenenti a vari settori dell'industria che hanno collaborato nell'ambito del W3C, il World Wide Web Consortium. La specifica è a disposizione di chiunque voglia utilizzarla (all'indirizzo www.w3.org), e sono molte le organizzazioni e le società che già lo fanno.
Se due società si accordano per utilizzare un programma che sia in grado di convertire i rispettivi documenti in XML sulla base di uno stesso DTD, potranno scambiarsi i documenti e le relative informazioni in qualsiasi momento senza correre il rischio di perdere dati a causa dell'incompatibilità dei formati utilizzati. Per maggiori dettagli sui DTD e sullo scambio di informazioni, consultate la sezione "DTD standard" in questo capitolo.
Per una trattazione più approfondita del linguaggio XML, consultate la sezione seguente, "Come usare l'XML".
Come usare l'XML
I documenti XML contengono dati strutturati che sono stati suddivisi in "elementi", ognuno dei quali viene descritto con i tag XML.
Elementi XML e tag XML
Un elemento XML contiene un dato, come ad esempio il nome di un'azienda, il titolo o il codice di articolo. Per creare un elemento, è sufficiente inserire un'informazione fra due tag XML: un tag di apertura che racchiude il nome dell'elemento fra un simbolo "minore di" e un simbolo "maggiore di", e un tag di chiusura identico a quello di apertura ma con l'aggiunta di una barra (/) prima del nome dell'elemento. Ad esempio, l'elemento "nome" codificato con i tag potrebbe avere il seguente aspetto:
<nome>Giacomo</nome>
G È importante capire la differenza fra elemento XML e tag XML. Un tag XML è semplicemente l'etichetta assegnata a un'informazione; un elemento XML comprende sia l'informazione che i tag in cui detta informazione è racchiusa.
I tag XML permettono di descrivere e di aggiungere una struttura ai dati che essi stessi circondano. Ad esempio, il seguente paragrafo introduttivo è stato codificato con il tag <introduzione>:
<introduzione>
Frank Lloyd Wright è stato uno degli architetti più bravi e famosi d'America. Questa è la storia della sua vita.
</introduzione>
All'interno dell'elemento <introduzione> potete codificare dei sottoelementi per definire ancor meglio la struttura del documento:
<introduzione>
<nome>Frank Lloyd Wright</nome> è stato uno degli <mestiere>architetti</mestiere> più bravi e famosi d'America. Questa è la storia della sua vita.
</introduzione>
G La sintassi dei tag XML è importante. A differenza dei tag HTML, i tag XML sono sensibili alle lettere maiuscole e minuscole, per cui il tag <Nome> è diverso dal tag <nome>, che è diverso dal tag <NOME>. Ogni nome di un tag XML deve iniziare con una lettera o con un trattino di sottolineatura (_); i restanti caratteri possono essere lettere, trattini di sottolineatura, numeri, trattini e punti, ma non possono contenere spazi, né punti di tabulazione. Ad esempio, il nome del tag XML <_.dir> è un nome corretto, mentre i nomi <_ dir> e <.dir> non lo sono. <_ dir> è errato perché contiene uno spazio bianco (punto di tabulazione o spazio) dopo il trattino di sottolineatura. Anche il nome di tag <.dir> è errato perché inizia con un punto e non con un trattino di sottolineatura o una lettera.
G È importante osservare che esiste una differenza fra "elementi" e "tipi di elementi". Un tipo di elemento è uno specifico nome di tag che può essere applicato ai dati; un elemento è costituito da un dato e dai tag in cui è racchiuso. Ad esempio, un documento contenente un elenco di nomi e indirizzi potrebbe comprendere solo due tipi di elementi, <nome> e <indirizzo>, ma centinaia di elementi che utilizzano quei tag.
Attributi XML
Supponete di stare lavorando con elementi codificati con il tag <auto> e di voler specificare informazioni supplementari su ciascun elemento creato. Ad esempio, immaginate di voler definire un determinato elemento <auto> non semplicemente come un'automobile, ma come un'automobile veloce, rossa e costosa.
A questo scopo è possibile utilizzare svariati metodi. Uno di questi consiste nel creare tipi di elementi aggiuntivi, come indicato nell'esempio seguente:
<auto>
<velocità>veloce</velocità>
<colore>rossa</colore>
<costo>costosa</costo>
1995 Geo Metro
</auto>
Un altro metodo, forse più "ordinato", prevede l'utilizzo di una particolare caratteristica del linguaggio XML, gli attributi. Essi hanno la funzione di fornire informazioni su un elemento e vengono inseriti all'interno del tag di apertura di un elemento, così che sia possibile capire inequivocabilmente a quale elemento si riferiscono.
Un attributo è composto da un nome, seguito dal simbolo di uguale, seguito da un valore incluso fra virgolette. Riprendendo l'esempio precedente, osservate ora come il singolo elemento qui riportato fornisce le medesime informazioni utilizzando tre attributi:
<auto velocità="veloce" colore="rossa" costo="costosa">
1995 Geo Metro
</auto>
Gli attributi sono utili per varie ragioni. Ad esempio facilitano la ricerca all'interno di un documento per generare un elenco di tutti gli elementi <auto> che comprendono l'attributo costo con valore "costosa". Essi si rivelano utili anche combinati con elementi vuoti, come illustrato nella sezione che segue.
Elementi vuoti
Gli elementi vuoti sono costituiti da un tag di apertura e un tag di chiusura che non racchiudono alcun dato, come nell'esempio seguente:
<codiceID></codiceID>
Poiché gli elementi vuoti non presentano alcun contenuto fra i tag, i tag di apertura e chiusura sono spesso combinati, come nell'esempio seguente:
<codiceID/>
Gli elementi vuoti possono quindi essere utilizzati insieme agli attributi per far riferimento a un URL o a file memorizzati esternamente. L'elemento vuoto che segue potrebbe ad esempio essere utilizzato (con l'interprete XML appropriato) per visualizzare l'immagine di un'automobile:
<immagineAuto URL="1995GeoMetro.jpg"/>
G Si noti che la semplice aggiunta di un attributo denominato "URL" a un elemento non garantisce l'accesso all'URL in fase di elaborazione del file XML. L'applicazione che elabora il file deve sapere cosa fare con l'attributo URL.
Commenti
Nei file XML, come già nei file HTML, è possibile includere dei commenti. I commenti vengono racchiusi fra <!-- e -->, e di fatto vengono ignorati dai processori XML. Quindi, per inserire un commento sullo stato di un elemento <indirizzo>, si potrebbe scrivere quanto segue:
<Indirizzo>
<!-- In attesa di ricevere questo indirizzo dal reparto Contabilità. -->
</Indirizzo>
G In questo manuale i commenti sono sempre riportati in blu per facilitarne l'individuazione.
Istruzioni di procedura
Nell'HTML i commenti vengono spesso utilizzati per inserirvi speciali comandi per i browser e altri processori HTML. Nel tentativo di limitare i commenti XML ad essere, appunto, solo dei commenti, gli autori della specifica XML hanno previsto un metodo per l'inserimento di comandi personalizzati nei file XML e nei DTD. Questi comandi personalizzati, detti istruzioni di procedura (o "PI"), sono semplicemente racchiusi fra <? e ?>. Essi iniziano con il nome di un'applicazione, seguito da uno spazio e da una qualsiasi informazione che potrebbe essere interessante per l'applicazione specificata. Le istruzioni di procedura possono essere utilizzate dovunque appaiano i commenti.
Dichiarazione XML
Ogni documento XML può e deve iniziare con una dichiarazione XML che, come le istruzioni di procedura, viene racchiusa fra <? e ?>. Quello che segue è un esempio di dichiarazione XML:
<?xml version="1.0" standalone="yes"?>
L'attributo "version" dichiara che il documento è conforme alle regole dell'XML 1.0. L'attributo "standalone" indica che tutte le dichiarazioni di marcatura necessarie per elaborare il documento XML sono incluse nel documento stesso.
Riferimenti a entità
Un riferimento a un'entità è un'espressione utilizzata come forma abbreviata di una parola, una stringa o un file. Ad esempio, utilizzando il riferimento a entità < per rappresentare il carattere "minore di" (<) nel contenuto di un documento XML, è possibile evitare di confondere il parser XML che altrimenti interpreterebbe erroneamente il carattere "<" come l'inizio di un tag. Per ulteriori informazioni sui riferimenti a entità, consultate il paragrafo "Riferimenti a entità" nella sezione "Come usare i DTD" contenuta in questo capitolo.
XML "Ben-Formato"
Per poter essere definito "Ben-Formato", un documento XML può e deve iniziare con una dichiarazione XML e devecontenere un elemento al livello principale che contenga tutti gli altri elementi (<articolo> nell'esempio che segue). In un documento XML "Ben-Formato", inoltre, ogni elemento ha un tag di chiusura corrispondente. Quello che segue è un esempio di documento XML "Ben-Formato":
<?xml version="1.0" standalone="yes"?>
<articolo>
<notizieflash>
<titolo>Il Museo dei Trasporti chiude i battenti</titolo>
<autore>Linda Spano</autore>
<contenuto>
Il Museo dei Trasporti chiuderà la prossima settimana.
</contenuto>
</notizieflash>
</articolo>
XML valido
Un documento XML "Ben-Formato" può essere tuttavia poco utile se non è anche valido. Per essere ritenuto valido il documento deve conformarsi alle specifiche di un determinato DTD. Per ulteriori informazioni sui DTD e sulla validazione dei documenti XML, consultate la sezione "Come usare i DTD" in questo capitolo.
Processori XML
Un processore XML è semplicemente un programma che legge un file XML e lo elabora. Esistono vari tipi di processori XML: uno potrebbe convertire un file XML in una pagina Web HTML, in un file PDF o in un file PostScript; un altro potrebbe leggere "a voce alta" il contenuto di un file XML o convertire quel contenuto in Braille. Un processore XML potrebbe perfino essere usato per copiare contenuti XML strutturati in una base di dati.
Parser XML
I parser XML sono strumenti in grado di riconoscere le regole dell'XML e di verificare se un documento XML è ben formato. Essi tuttavia non verificano necessariamente se il documento è valido rispetto al relativo DTD; perché venga eseguita questa operazione occorre usare un parser XML di convalida (vedi qui di seguito).
Parser XML di convalida
I parser XML di convalida analizzano un documento XML in base a un DTD verificando se è conforme alle regole definite nel DTD. Un buon parser di convalida sarà anche in grado di fornire informazioni costruttive sui problemi eventualmente rilevati nel file XML. Per ulteriori informazioni sui parser XML, consultate la sezione "Come usare i DTD" in questo capitolo.
G Per una guida rapida alle funzionalità e alle convenzioni dell'XML, consultate l'appendice A, "Guida rapida all'XML", nel Capitolo 7, "Appendici".
Come usare i DTD
Un DTD (Definizione del Tipo di Documento) specifica quali elementi può contenere un file XML e come questi devono essere strutturati. A un documento XML non deve necessariamente essere abbinato un particolare DTD; se un file XML è conforme alla sintassi XML di base, verrà considerato "Ben-Formato" e potrà essere letto da una qualsiasi applicazione che sia in grado di gestire l'XML. Tuttavia, un file XML può essere definito "valido" soltanto se conforme a un particolare DTD.
I DTD sono importanti perché forniscono una struttura affidabile e ben documentata per i documenti XML. Se non si usa un DTD, due aziende che lavorano insieme potrebbero decidere di strutturare e codificare con tag i documenti XML in modi totalmente diversi, con il risultato che le rispettive banche dati rimarranno incompatibili anche dopo che entrambe le società sono passate all'XML. Tuttavia, dopo che entrambe le organizzazioni hanno lo stesso DTD (ad esempio un DTD che hanno sviluppato insieme o che è diventato il DTD standard di quel particolare settore industriale), potranno scambiare informazioni in modo facile e prevedibile.
DTD esterni e interni
Esistono due tipi di DTD: esterni e interni.
G Da un punto di vista tecnico, un DTD è costituito da un elenco di dichiarazioni di marcatura (dichiarazioni di elementi, dichiarazioni di attributi, entità, notazioni, istruzioni di procedura e commenti) a cui fa riferimento una dichiarazione DOCTYPE. Quelli che in questo documento vengono chiamati "DTD esterni" e "DTD interni" non sono dei DTD tecnicamente completi; tuttavia è più pratico e abbastanza comune chiamarli in questo modo.
DTD esterni
Un DTD esterno (o sottogruppo esterno) è un file contenente un elenco di dichiarazioni di marcatura. I DTD esterni possono essere facilmente condivisi fra documenti XML e organizzazioni. Per utilizzare un DTD esterno in un file XML, è sufficiente farvi riferimento all'inizio del file nel modo seguente:
<?xml version="1.0" standalone="no">
<!-- La riga che segue specifica un elemento al livello principale (<ilmioDocumento>) e indica l'URL di un file DTD esterno denominato
"ilmiodocumento.dtd" -->
<!DOCTYPE ilmioDocumento SYSTEM "http://www.quark.com/ilmiodocumento.dtd">
<!-- Il documento inizia qui -->
<ilmioDocumento>
Chi va con lo zoppo, impara a zoppicare.
</ilmioDocumento>
DTD interni
Un DTD interno (o sottogruppo interno) è incluso nel file XML che descrive. Per utilizzare un DTD interno in un file XML, è sufficiente aggiungerlo all'inizio del file XML nel modo seguente:
<?xml version="1.0" standalone="yes">
<!-- La riga che segue specifica un elemento al livello principale (<ilmioDocumento>) e segnala l'inizio del DTD -->
<!DOCTYPE ilmioDocumento [
<!-- Il DTD interno inizia qui -->
<!ELEMENT ilmioDocumento ANY>
<!-- Fine del DTD -->
]>
<!-- Il documento inizia qui -->
<ilmioDocumento>
Chi va con lo zoppo, impara a zoppicare.
</ilmioDocumento>
G Se un documento utilizza un DTD esterno (o un qualunque altro tipo di entità esterna), l'attributo "file autonomo" nella prima riga deve essere impostato su "no". Per ulteriori informazioni consultate "Uso dei riferimenti all'entità" in questa sezione.
Combinazione di DTD interni ed esterni
In un documento XML è possibile specificare un DTD esterno e quindi aggiungerlo o sostituirlo con un DTD interno. Ecco come si presenterebbe il documento XML:
<?xml version="1.0" standalone="no">
<!-- La riga che segue specifica un elemento al livello principale (<ilmioDocumento>), indica l'URL di un file DTD esterno denominato "ilmiodocumento.dtd" e quindi segnala l'inizio del DTD interno -->
<!DOCTYPE ilmioDocumento SYSTEM "http://www.quark.com/ilmiodocumento.dtd" [
<!-- Il DTD interno va qui; potrebbe aggiungere nuovi tipi di elementi oltre a quelli definiti nel DTD esterno -->
<!ELEMENT ilmioElementoDTDlocale UNO QUALSIASI>
<!-- Fine del DTD -->
]>
<!-- Il documento inizia qui -->
<ilmioDocumento>
<ilmioElementoDTDlocale>
Chi va con lo zoppo, impara a zoppicare.
</ilmioElementoDTDlocale>
</ilmioDocumento>
Pianificazione di un DTD
Molto probabilmente non avrete voglia di mettervi a scrivere un DTD, dato che la pianificazione di un DTD potrebbe impiegare molto tempo se intendete fare le cose come si deve.
G Prima di cominciare a creare un DTD, potrebbe essere utile prendere in considerazione l'idea di utilizzare un DTD standard, ossia tipico del settore in cui opera la vostra azienda. Per ulteriori informazioni a questo proposito, consultate la sezione "DTD standard" in questo capitolo.
Innanzitutto cercate di capire esattamente a quali fini intendete utilizzare il DTD. Cominciate pensando a quali elementi volete utilizzare. Se volete usare degli elementi tipo <indirizzo>, determinate se quegli elementi vanno suddivisi in sottoelementi, come ad esempio <indirizzoPostale>, <numeroCivico>, <città>, <provincia> e <cap>. Prendete seriamente in considerazione l'ipotesi di effettuare queste suddivisioni se esiste la possibilità che un giorno dobbiate trasferire il contenuto dei file XML in una base di dati.
Questa era la parte semplice. Ora dovete pensare alle relazioni fra tutti questi elementi. Un DTD può specificare quali elementi sono ammessi, in che ordine devono comparire, e quali e quanti sottoelementi possono contenere. Inoltre può specificare quali altri elementi possono contenere un determinato elemento e se un dato elemento deve o non deve contenere dati.
Eliotte Rusty Harold, in XML: Extensible Markup Language, raccomanda di usare una tabella per facilitarsi il compito di definire le relazioni fra i vari elementi del DTD. La tabella dovrebbe comprendere le seguenti colonne (i dati riportati nelle colonne hanno unicamente scopo esemplificativo):
Nome elemento | Deve contenere | Può contenere | Contenuto in |
<indirizzo> | <indirizzoPostale>, | <c/o> | <datiPersonali> |
| <città>, <cap>, |
| <provincia> |
<indirizzoPostale> <indirizzo>
Ogni riga della tabella dovrebbe rappresentare un elemento che volete usare nel DTD.
Uso di un DTD
Un DTD è costituito da testo normale, proprio come un file XML. Un file XML può non utilizzare alcun DTD, oppure un DTD esterno o un DTD interno, oppure sia un DTD interno che uno esterno.
A prescindere dal tipo di DTD che utilizzato, il documento XML deve farvi riferimento o deve includerlo nel prologo, ossia nella sezione iniziale, subito dopo la dichiarazione XML e prima del testo principale del documento XML. La sezione del DTD inizia con "<!DOCTYPE nomeprincipale [" e termina con "]>". Qui di seguito riportiamo un esempio di un documento XML completo contenente un DTD completo (in grassetto):
<?xml version="1.0" standalone="yes">
<!-- Il DTD inizia qui -->
<!DOCTYPE messaggio [
<!ELEMENT messaggio ANY>
]>
<!-- Il documento inizia qui -->
<messaggio>
Chi va con lo zoppo, impara a zoppicare.
</messaggio>
Analizziamo l'esempio:
* Il nome principale (la parola dopo <!DOCTYPE) specifica il tipo di elemento al livello principale del file XML.
* Le parentesi quadre segnalano e racchiudono il DTD interno.
* "<!ELEMENT messaggio ANY>" definisce un tipo di elemento denominato "messaggio". "!ELEMENT" significa "Segue una dichiarazione del tipo di elemento." Troviamo quindi il nome dell'elemento ("messaggio") e informazioni su ciò che può contenere questo elemento (in questo caso "ANY", ovvero sia testo che altri elementi).
Come potete notare, ogni definizione del tipo di elemento specifica sia il nome dell'elemento che il tipo di dati che quell'elemento può contenere. Se si volesse cambiare la definizione del tipo di elemento per <messaggio> in modo che possa contenere testo e solo testo, ovvero nessun altro elemento, lo si potrebbe fare sostituendo la parola chiave "ANY" con "(#PCDATA)" nel modo seguente:
<?xml version="1.0" standalone="yes">
<!-- Il DTD inizia qui -->
<!DOCTYPE messaggio [
<!ELEMENT messaggio (#PCDATA)>
]>
<!-- Il documento inizia qui -->
<messaggio>
Chi va con lo zoppo, impara a zoppicare.
</messaggio>
Ma è probabile che non vogliate apportare questa modifica perché significherebbe che l'elemento al livello principale del documento potrebbe contenere soltanto dati carattere analizzati (si veda la nota più oltre) e non si potrebbero aggiungere altri elementi per suddividere le informazioni.
G "PCDATA" sta per "parsed character data" (ossia, dati carattere analizzati), vale a dire testo che può contenere riferimenti a entità, commenti e istruzioni di procedura.
Vediamo ora un esempio di DTD più vicino alla vita reale. Il DTD interno che segue definisce una struttura per un elenco di indirizzi di filiali:
<!-- L'elemento al livello principale è <elencoIndirizziFiliali> -->
<!ELEMENT elencoIndirizziFiliali ANY>
<!ELEMENT indirizzoPostale (#PCDATA)>
<!ELEMENT città (#PCDATA)>
<!ELEMENT provincia (#PCDATA)>
<!ELEMENT cap (#PCDATA)>
<!ELEMENT paese (#PCDATA)>
<!ELEMENT telefono (#PCDATA)>
<!ELEMENT fax (#PCDATA)>
<!ELEMENT indirizzoElettronico (#PCDATA)>
Notate che abbiamo inserito un commento per indicare che <elencoIndirizziFiliali> è l'elemento a livello principale del DTD. Lo abbiamo fatto perché un DTD non può specificare esplicitamente l'elemento al livello principale; infatti, tecnicamente parlando, ciò è il compito della riga !DOCTYPE di un documento XML. Ma è comunque consigliabile segnalare con un commento gli elementi al livello principale in modo che chi usa il DTD possa capire quali sono.
G Alcuni DTD possono contenere più elementi che fungono da elemento al livello principale. Ad esempio, è possibile scrivere un DTD che contenga le definizioni sia per documenti contenenti schede tecniche che per documenti di domande frequenti, e utilizzare poi quei DTD per creare entrambi i tipi di documenti semplicemente specificando <whitePaper> o <domandeFrequenti> come elemento al livello principale di ciascun file XML.
Le restanti righe del DTD dichiarano gli elementi relativi a indirizzo, città, provincia, codice postale, nazione, numero di telefono, numero di fax e indirizzo elettronico di ciascuna filiale.
Determinazione della scelta e dell'ordine dei tag
Il DTD qui riportato potrebbe andare benissimo nel vostro caso, ma in effetti non sfrutta le funzionalità dell'XML. Ad esempio, non specifica alcuno strumento per indicare quali elementi di indirizzo vadano abbinati a ciascuna filiale, e non specifica alcun ordine particolare per le informazioni. Potreste quindi creare un documento che elenca tutte le varie città, vie, numeri di telefono, ecc., in ordine casuale, che sarebbe comunque valido sulla base di questo DTD.
Per conferire una struttura significativa a un DTD, occorre combinare fra loro tutti i componenti di ciascun elemento e disporli in un ordine particolare. A questo scopo si potrebbe creare un elemento recipiente destinato a contenere le informazioni relative a una singola filiale (che chiameremo <filiale>), specificando quindi quali sottoelementi debba contenere quell'elemento recipiente e l'ordine in cui vanno collocati. Possiamo fare tutto questo semplicemente aggiungendo una riga al DTD (in grassetto):
<!-- L'elemento al livello principale è <elencoIndirizziFiliali> -->
<!ELEMENT elencoIndirizziFiliali ANY>
<!ELEMENT indirizzoPostale (#PCDATA)>
<!ELEMENT città (#PCDATA)>
<!ELEMENT provincia (#PCDATA)>
<!ELEMENT cap (#PCDATA)>
<!ELEMENT paese (#PCDATA)>
<!ELEMENT telefono (#PCDATA)>
<!ELEMENT fax (#PCDATA)>
<!ELEMENT indirizzoElettronico (#PCDATA)>
<!ELEMENT filiale (indirizzoPostale, città, provincia, cap, paese, telefono, fax, indirizzoElettronico)>
Questo nuovo elemento va letto così: "Se il documento contiene un elemento denominato <filiale>, esso deve contenere esattamente un'istanza di ciascuno dei seguenti elementi, in questo ordine, e nient'altro."
E se l'indirizzo postale di una delle filiali consiste di più righe? In questo caso, è possibile consentire l'immissione di una o più istanze di un qualsiasi elemento di un elenco di sottoelementi aggiungendo un segno + alla fine del nome dell'elemento. Ad esempio, per permettere di inserire uno o più elementi <indirizzoPostale> nell'elemento <filiale>, potremmo procedere nel modo seguente:
<!ELEMENT filiale (indirizzoPostale+, città, provincia, cap, paese, telefono, fax, indirizzoElettronico)>
E se qualche filiale non ha il fax? E se qualcuna ne ha più d'uno? Per specificare zero o più istanze di un elemento, potete aggiungere un * alla fine del nome dell'elemento come nell'esempio seguente:
<!ELEMENT filiale (indirizzoPostale+, città, provincia, cap, paese, telefono, fax*, indirizzoElettronico)>
E se qualcuna delle filiali fosse in un paese dove non si utilizza il codice di avviamento postale? Per specificare la possibilità che vi siano zero o una sola istanza di un determinato elemento, aggiungere un punto interrogativo alla fine del nome dell'elemento come illustra l'esempio:
<!ELEMENT filiale (indirizzoPostale+, città, provincia, cap?, paese, telefono, fax*, indirizzoElettronico)>
Quella che viene chiamata "provincia" in Italia, potrebbe avere un nome diverso altrove. Gli Stati Uniti, ad esempio, sono suddivisi in stati. Se avete uffici sia in Italia che negli Stiti Uniti, può essere utile dare la possibilità di utilizzare un elemento <provincia> oppure un elemento <stato>. A questo scopo inserite le due opzioni in una coppia di parentesi, separandole con il carattere | come nell'esempio qui riportato:
<!ELEMENT filiale (indirizzoPostale+, città, (provincia|stato), cap?, paese, telefono, fax*, indirizzoElettronico)>
Infine, possiamo fare in modo che un <elencoIndirizziFiliali> comprenda soltanto i dati di ogni singola <filiale> cambiando la definizione di <elencoIndirizziFiliali> da ANY in (filiale*). Ed ecco il risultato finale:
<!-- L'elemento al livello principale è <elencoIndirizziFiliali> -->
<!ELEMENT elencoIndirizziFiliali (filiale*)>
<!ELEMENT indirizzoPostale (#PCDATA)>
<!ELEMENT città (#PCDATA)>
<!ELEMENT provincia (#PCDATA)>
<!ELEMENT stato (#PCDATA)>
<!ELEMENT cap (#PCDATA)>
<!ELEMENT paese (#PCDATA)>
<!ELEMENT telefono (#PCDATA)>
<!ELEMENT fax (#PCDATA)>
<!ELEMENT indirizzoElettronico (#PCDATA)>
<!ELEMENT filiale (indirizzoPostale+, città, (provincia|stato), cap?, paese, telefono, fax*, indirizzoElettronico)>
Per riassumere:
Simbolo Significato
Nessuno Esattamente uno
+ Uno o più
* Zero o più
? Zero o uno
I simboli speciali possono essere utilizzati insieme alle parentesi per creare dichiarazioni di tipi di elementi complessi come illustrato nel seguente DTD, che è stato creato per elencare le informazioni relative ai contatti su base giornaliera:
<!-- L'elemento al livello principale è <programmaContatti> -->
<!ELEMENT programmaContatti (informazioniContatti*)>
<!ELEMENT telefonoUfficio (#PCDATA)>
<!ELEMENT data (#PCDATA)>
<!ELEMENT faxUfficio (#PCDATA)>
<!ELEMENT telefonoCasa (#PCDATA)>
<!ELEMENT cercapersone (#PCDATA)>
<!ELEMENT faxCasa (#PCDATA)>
<!ELEMENT cittàdiTrasferta (#PCDATA)>
<!ELEMENT telefonodiTrasferta (#PCDATA)>
<!ELEMENT faxdiTrasferta (#PCDATA)>
<!ELEMENT indirizzoElettronico (#PCDATA)>
<!ELEMENT Messaggio (#PCDATA)>
<!ELEMENT informazioniContatto (data, ((telefonoUfficio, faxUfficio*, indirizzoElettronico) | ((telefonoCasa | cercapersone)+, faxCasa*, indirizzoElettronico) | ((telefonodiTrasferta | cercapersone)+, faxdiTrasferta*, indirizzoElettronico)), Messaggio?)>
In un determinato giorno la persona cui si riferisce questo elenco potrebbe essere in ufficio, a casa o in trasferta di lavoro. Quindi ogni elemento <informazioniContatti> potrebbe comprendere uno dei seguenti elenchi di informazioni con i sottoelementi nell'ordine indicato:
* La data, il numero di telefono dell'ufficio, zero o più numeri di fax dell'ufficio, l'indirizzo elettronico, e zero o un messaggio.
* La data, uno o più numeri di telefono di casa e/o numeri di cercapersone, zero o più numeri di fax di casa, l'indirizzo elettronico, e zero o un messaggio.
* La data, uno o più numeri di telefono presso cui la persona è reperibile quando è in trasferta di lavoro e/o numeri di cercapersone, zero o più numeri di fax per quando è in trasferta di lavoro, l'indirizzo elettronico, e zero o un messaggio.
Uso di tag vuoti
Talvolta può essere utile compilare i documenti XML in modo tale che possano essere facilmente convertiti nel formato HTML. In tal caso, potrebbe essere consigliabile includere tag quali <BR> e <HR> nel file XML per consentirne una conversione letterale nel file HTML.
Questi tag non possono in effetti essere inseriti così come sono nell'XML in quanto ogni elemento deve avere un tag di chiusura. Si possono tuttavia utilizzare i cosiddetti tag EMPTY lasciando poi a un convertitore XML-HTML il compito di trasformarli nei tag di output appropriati. Ad esempio, per ottenere la creazione di tag <HR>, dovreste includere la riga seguente nel DTD:
<!ELEMENT HR EMPTY>
Per utilizzare questo tag, potreste inserire nel file XML una riga come quella che segue:
<HR/>
Non potete includerlo come "<HR>" perché ogni tag XML deve avere un corrispondente tag di chiusura oppure terminare con una barra, ma questo non costituisce un problema: un convertitore XML-HTML si occuperà di convertire <HR/> in <HR>.
G I tag EMPTY vengono spesso usati per le immagini. L'URL dell'immagine viene memorizzata in uno degli attributi del tag EMPTY. Per ulteriori informazioni sugli attributi, consultate "Definizione degli attributi" in questa sezione.
Uso dei riferimenti a carattere
I riferimenti a carattere permettono di rappresentare i caratteri Unicode nei dati carattere analizzati. La sintassi dei riferimenti a carattere è la seguente:
&#ValoreUnicodeDelCarattere;
Ad esempio, per inserire il simbolo dell'euro prima del numero 500 in un elemento <importo>, si potrebbe scrivere quanto segue (riferimento a carattere in grassetto):
<importo>€500</importo>
G È compito del processore XML sostituire i caratteri Unicode appropriati ai riferimenti a entità di carattere in fase di output.
Uso dei riferimenti all'entità
Un riferimento all'entità è una piccola porzione di testo che rappresenta qualcos'altro, ad esempio un carattere, una stringa di testo, un file XML esterno, o un file binario, come un file d'immagine o un file audio. Esistono cinque tipi di riferimenti all'entità:
* Riferimenti a entità interne analizzate. Rappresentano stringhe di testo riutilizzate di frequente.
* Riferimenti a entità esterne analizzate. Fanno riferimento a file di testo memorizzati esternamente contenenti dati analizzabili.
* Riferimenti a entità esterne non analizzate. Spesso utilizzati per fare riferimento a file binari quali immagini, fogli elettronici e suoni.
* Riferimenti a entità parametriche interne. Rappresentano dichiarazioni di marcatura spesso riutilizzate all'interno dei DTD (sempre analizzati).
* Riferimenti a entità parametriche esterne. Fanno riferimento a file di testo memorizzati esternamente contenenti dati analizzabili dall'interno dei DTD (sempre analizzati).
Questi tipi di riferimenti a entità sono descritti in dettaglio nei paragrafi seguenti.
H Qual è la differenza fra un'entità e un riferimento all'entità? Un riferimento all'entità è un'abbreviazione inserita in un documento XML per rappresentare un'entità. Un'entità è il contenuto che sostituisce il riferimento all'entità durante l'elaborazione del file XML.
Riferimenti a entità interne analizzate
Un riferimento all'entità interna analizzata è sostanzialmente un'abbreviazione utilizzata al posto di una stringa di caratteri che si prevede di riutilizzare spesso in un determinato documento XML. Il formato da usare per dichiarare un riferimento all'entità interna analizzata in un DTD è la seguente:
<!ENTITY nomeEntità "testo sostitutivo">
Immaginate ad esempio di voler creare un documento XML contenente un elenco di dipendenti e determinati informazioni su ciascuno di essi. La documentazione relativa a ciascun dipendente deve contenere anche la stringa "Anni di servizio in azienda:" seguita da un numero. Anziché digitare ripetutamente la stringa, potete creare un riferimento all'entità interna analizzata per questa stringa come parte del DTD del documento, come riportato nell'esempio seguente:
<!-- L'elemento a livello principale è <elencoDipendenti> -->
<!DOCTYPE elencoDipendenti [
<!-- Il DTD inizia qui -->
<!ENTITY anni "Anni di servizio in azienda:">
<!ELEMENT elencoDipendenti (dipendente*)>
<!ELEMENT nome (#PCDATA)>
<!ELEMENT matricola (#PCDATA)>
<!ELEMENT anni di ServizioinAzienda (#PCDATA)>
<!ELEMENT dipendente (nome, matricola, anni di ServizioinAzienda)>
]>
Per utilizzare il riferimento all'entità interna analizzata "anni" nel documento XML, potremmo scrivere quanto segue:
<dipendente>
<nome>Alessandro Battaglia</nome>
<matricola>H867KL671BR</matricola>
<annidiServizioinAzienda>&anni; 12</annidiServizioinAzienda>
</dipendente>
Durante l'elaborazione dell'elemento <dipendente>, il processore XML espande il riferimento all'entità interna analizzata generando il seguente XML:
<dipendente>
<nome>Alessandro Battaglia</nome>
<matricola>H867KL671BR</matricola>
<annidiServizioinAzienda>Anni di servizio in azienda : 12</annidiServizioinAzienda>
</dipendente>
Il linguaggio XML prevede cinque riferimenti a entità interne analizzate predefiniti. Diversamente da tutti gli altri riferimenti a entità interne analizzate, questi fanno parte della specifica XML e quindi non occorre dichiararli.
Carattere Riferimento a entità
< <
> >
& &
" "
' '
Supponete ad esempio di dover utilizzare il segno "maggiore di" (>) nel contenuto del documento XML che state preparando. Come già sapete, il segno "maggiore di" indica la fine di un tag nell'XML. Per evitare di confondere il processore XML, potete sostituire il segno "maggiore di" con ">" dovunque appaia. Ad esempio, per esprimere "il tutto > somma delle sue parti" in un file XML, potreste scrivere:
<luogoComune>
il tutto > somma delle sue parti
</luogoComune>
Esistono tre limitazioni per quanto riguarda l'uso dei riferimenti a entità interne analizzate:
* È necessario dichiarare i riferimenti a entità interne analizzate prima di utilizzarli (fanno eccezione i cinque elencati nella tabella precedente).
* I riferimenti a entità interne analizzate possono essere utilizzati nel contenuto degli elementi e nei valori degli attributi.
* I riferimenti a entità interne analizzate possono essere utilizzati all'interno di altri riferimenti a entità interne analizzate, ma solo se ciò non genera un riferimento circolare. Ad esempio, non è consentito usare il riferimento a un'entità interna analizzata A nel riferimento a un'entità interna analizzata B se quest'ultimo è utilizzato nel riferimento a un'entità interna analizzata A.
Riferimenti a entità esterne analizzate
I riferimenti a entità esterne analizzate consentono di includere nel documento il contenuto salvato in file di testo esterni. Tali riferimenti devono essere dichiarati nel DTD in uno dei modi seguenti:
<!ENTITY nomeEntità SYSTEM "URL del file da riferire">
<!ENTITY nomeEntità PUBLIC "nome del file da riferire"
"URL del file da riferire">
Il primo metodo prevede l'utilizzo dell'URL di un determinato file. Il secondo metodo, invece, consente di usare il nome di una risorsa che a sua volta può indicare un URL. L' URL che ne risulta è una sorta di URL "di backup", da utilizzare soltanto se il nome non può essere risolto.
I riferimenti a entità esterne analizzate possono essere utilizzati per permettere di condividere il contenuto fra più file XML. Ecco un intero documento XML d'esempio il cui contenuto è memorizzato in un file di testo denominato "ilmiofile.txt" situato nel sito Web di Quark™ :
<?xml version="1.0" standalone="no">
<!-- L'elemento al livello principale è <ilmioLivelloPrincipale> -->
<!DOCTYPE ilmioLivelloprincipale [
<!-- Il DTD inizia qui -->
<!ELEMENT ilmioLivelloprincipale ANY>
<!ENTITY contenutoXml SYSTEM "http://www.quark.com/ilmiofile.txt">
]>
<!-- Il documento inizia qui -->
<ilmioLivelloprincipale>
&contenutoXml;
</ilmioLivelloprincipale>
Questa soluzione si rivela molto pratica in quanto permette di utilizzare il contenuto di "ilmiofile.txt" anche in altri file XML.
G Se un documento utilizza riferimenti a entità esterne, occorre impostare l'attributo "standalone" (file autonomo) nella dichiarazione XML su "no."
Riferimenti a entità esterne non analizzate
E se voleste fare riferimento a immagini, fogli elettronici, file audio, file HTML o ad altri file non XML in un documento? In questo caso non è possibile utilizzare un riferimento all'entità esterna analizzata in quanto il processore XML tenterebbe di analizzare il file binario e ciò provocherebbe degli errori.
Per ovviare a tale inconveniente, potete aggiungere una notazione alla fine del riferimento all'entità esterna per comunicare al processore XML di non analizzare il file di destinazione e indicare di che tipo di file si tratta. La sintassi da usare per dichiarare una notazione in un DTD è la seguente:
<!NOTATION nomeNotazione SYSTEM "NomeApplicazione">
Ad esempio, per creare un collegamento fra i file JPEG e Adobe® Photoshop®, potreste aggiungere una notazione come la seguente al DTD:
<!NOTATION jpeg SYSTEM "Adobe Photoshop">
Per utilizzare una notazione in una dichiarazione di riferimento all'entità esterna, rifatevi alla seguente sintassi:
<!ENTITY nomeEntità SYSTEM "URL" NDATA nomeNotazione>
Ad esempio, per creare un'entità denominata "lamiaImmagine" che indichi un URL contenente un file JPEG, potreste usare il tag seguente:
<!ENTITY lamiaImmagine SYSTEM "http://www.quark.com/immagine.jpg" NDATA jpeg>
Potreste anche usare la sintassi PUBLIC con notazioni, specificando dapprima il nome di una notazione pubblica e poi un URL di notazione di backup:
<!ENTITY lamiaImmagine PUBLIC "-//Quark//Nome inventato JPEG"
"http://www.quark.com/xml/immagine.jpg" NDATA jpeg>
H Altri metodi per fare riferimento a file esterni. I riferimenti a entità non analizzate non sono l'unico modo per fare riferimento a file esterni nei file XML senza specificare che devono essere analizzati. È infatti possibile memorizzare anche l'URL di tali file come semplice contenuto di un elemento o di un attributo. Nel primo degli esempi che seguono si fa riferimento all'URL di un file d'immagine sotto forma di contenuto dell'elemento, mentre nel secondo si fa riferimento allo stesso URL sotto forma di contenuto dell'attributo:
<lamiaImmagine>http://www.quark.com.immagine.jpg</lamiaImmagine>
<lamiaImmagine URL="http://www.quark.com.immagine.jpg"/>
La scelta di utilizzare entità non analizzate, elementi o attributi per fare riferimento a file non XML è una questione del tutto soggettiva. Ciascuno di questi metodi funzionerà ugualmente bene, a condizione che l'applicazione che elabora l'XML sia in grado di riconoscere un URL come tale.
Riferimenti a entità parametriche interne
Se desiderate creare un riferimento a un'entità da utilizzare soltanto all'interno di un determinato DTD, dovete creare un riferimento a entità parametriche. Un riferimento a entità parametriche interne è molto simile a un riferimento a entità interne analizzate, con la differenza che inizia con il segno % anziché con la e commerciale (&), sia nella sua dichiarazione che quando lo si utilizza:
<!ENTITY % nomeEntità "definizione dell'entità">
%nomeEntità;
I riferimenti a entità parametriche interne possono essere utilizzati nel sottogruppo esterno di un DTD nello stesso modo in cui si utilizzano le entità interne analizzate in un documento XML. Nell'esempio che segue utilizziamo un riferimento a entità parametriche interne per creare un rapido metodo per far riferimento a un modello di contenuto che descrive il nome di una persona:
<!ENTITY % nome "(nomeDiBattesimo, cognome)">
<!ELEMENT nomeTitolareAzienda %nome;>
<!ELEMENT nomeDipendente %nome;>
<!ELEMENT nomeCliente %nome;>
L'utilità di questa soluzione sta nel fatto che rende più facile cambiare la definizione di tutti i tipi di nomi contemporaneamente. Quindi, se per esempio decidete di registrare anche il secondo nome di tutti i titolari dell'azienda, di tutti i dipendenti e tutti i clienti, sarà sufficiente modificare la dichiarazione di entità parametrica interna vista prima nel modo seguente:
<!ENTITY % nome "(nomeDiBattesimo, secondoNome, cognome)">
G Notate che questo tipo di riferimento a entità parametriche interne può essere utilizzato soltanto nel sottogruppo esterno di un DTD.
Riferimenti a entità parametriche esterne
Un riferimento a entità parametriche esterne è molto simile a un riferimento a entità esterne analizzate, con la differenza che inizia con il segno % anziché con la e commerciale (&), sia nella sua dichiarazione che quando lo si utilizza. Ad esempio, le due righe seguenti (estratte da un sottogruppo interno di un documento XML) creano innanzitutto un riferimento a un'entità indicando un DTD esterno denominato "intestazioneStandard.dtd" e poi includono quel DTD esterno nel file XML:
<!ENTITY % intestazioneStandard SYSTEM "intestazioneStandard.dtd">
%intestazioneStandard;
Per ulteriori informazioni a questo proposito, consultate "Uso dei DTD pubblici" in questa sezione.
G I riferimenti a entità parametriche possono essere utilizzati soltanto all'interno di un DTD.
I riferimenti a entità parametriche interne ed esterne possono essere utilizzati insieme. Ad esempio, potete usare i riferimenti a entità parametriche interne nel sottogruppo interno per far riferimento a entità definite nel sottogruppo esterno. L'utilità di questa soluzione sta nel fatto che consente di cambiare la definizione di un'entità senza costringere a modificare il sottogruppo interno dei file XML che utilizzano quell'entità. Potreste ad esempio includere la dichiarazione seguente in un file di testo denominato "fileEntità.txt":
<!ENTITY % entitàNome "<!ELEMENT nome (nomeDiBattesimo, cognome)>">
Quindi, potete includere quanto segue nel sottogruppo interno dei documenti XML:
<!-- Includi il file che contiene l'entità precedente -->>
<!ENTITY % fileEntità SYSTEM "entitàNome.txt">
%fileEntità;
<!-- Ora chiama l'entità definita nel file esterno -->
%entitàNome;
Questo approccio consente di cambiare la definizione del riferimento a entità entitàNome in un numero qualsiasi di documenti XML semplicemente cambiandola nel file "fileEntità.txt".
Definizione degli attributi
Oltre al contenuto, gli elementi possono anche avere degli attributi (vedi "Considerazioni generali sull'XML" in questo capitolo). Non c'è completo accordo circa il ruolo degli attributi, ma ai fini di questa discussione, diremo che un attributo dovrebbe contenere informazioni su un elemento che siano importanti per il processore XML e che, tuttavia, non facciano parte del contenuto del file XML come tale.
Supponiamo ad esempio che stiate utilizzando l'XML per gestire un elenco di libri da visualizzare su un sito Web. L'elenco può essere visualizzato in due modi: nella sua interezza o come elenco di tutti i libri aggiunti negli ultimi 10 giorni. Per ottenere questo risultato, il documento XML deve contenere l'indicazione della data in cui viene immesso ciascun libro.
Potreste aggiungere il tag secondario <immessoInData> alla definizione del tag <libro>, ma di fatto la data in cui un determinato libro è stato immesso nel sistema non è un'informazione che riguarda il libro in sé, quindi potreste decidere in alternativa di creare un attributo denominato "immessoInData".
La sintassi per la dichiarazione di attributi è la seguente:
<!ATTLIST nomeElemento nomeAttributo TipoAttributo ValoreDiDefault>
Di conseguenza, per assegnare all'elemento <libro> un attributo "immessoInData" con il valore di default "01/01/2000", dobbiamo aggiungere la riga seguente alla DTD:
<!ATTLIST libro immessoInData CDATA "01/01/2000">
Quindi, per usare questo attributo in un elemento <libro>, dobbiamo semplicemente usare una coppia attributo-valore come quella seguente:
<libro immessoInData="11/11/1998">
La descrizione del libro va qui
</libro>
Questo attributo fornisce al processore XML le informazioni necessarie per visualizzare i libri in base alla data di immissione nell'elenco.
Attributi richiesti, impliciti e fissi
Ogni attributo può essere richiesto, implicito o fisso. Un attributo di default richiesto (required) indica che l'elemento deve contenere questo attributo. Ad esempio, la seguente dichiarazione di attributo specifica che ogni elemento <libro> deve avere un attributo "immessoInData":
<!ATTLIST libro immessoInData CDATA #REQUIRED>
Un attributo di default implicito (implied) indica che l'elemento può o non può contenere questo attributo, a discrezione dell'autore dell'XML. Ad esempio, la seguente dichiarazione di attributo specifica che ogni elemento <libro> può o non può contenere un attributo "immessoInData":
<!ATTLIST libro immessoInData CDATA #IMPLIED>
Un valore di attributo fisso (fixed) indica che l'attributo deve contenere un valore esatto per ciascun elemento. Ad esempio, la seguente dichiarazione di attributo specifica che ogni <libro> deve avere un valore di "immessoInData" equivalente a "11/11/1998":
<!ATTLIST libro immessoInData CDATA #FIXED "11/11/1998">
In questo esempio il processore XML suppone che ogni elemento <libro> abbia un attributo "immessoInData" impostato su "11/11/1998" anche se l'attributo viene omesso.
G Se una dichiarazione di attributo ha un valore di default, ma non specifica #REQUIRED, #IMPLIED o #FIXED, il processore XML utilizzerà il valore di default per l'attributo in tutti i casi in cui l'attributo viene omesso.
Tipi di attributi
La parola chiave CDATA nella nostra dichiarazione di attributo d'esempio indica che l'attributo deve contenere dati carattere. CDATA è tuttavia soltanto uno dei tipi di attributi disponibili. Ne forniamo l'elenco completo qui di seguito.
* L'attributo CDATA può contenere dati carattere e riferimenti a entità.
* L'attributo ENTITY deve contenere il nome di un'entità non analizzata dichiarata nel DTD. (Per ulteriori informazioni sulle entità, consultate "Uso dei riferimenti a entità" in questa sezione.) Ad esempio, potreste usare un attributo ENTITY per includere l'URL di un'immagine:
<!-- Nel DTD -->
<!ENTITY copertinaDiDefault SYSTEM "nessunaCopertina.jpg" NDATA jpg>
<!ENTITY lamiaCopertina SYSTEM "lamiaCopertinaDelLibro.jpg" NDATA jpg>
...
<!ATTLIST libro copertina ENTITY copertinaDiDefault>
<!-- Nell'XML -->
<libro copertina="miaCopertina">
La descrizione del libro va qui
</libro>
* L'attributo ENTITIES deve contenere i nomi di una o più entità non analizzate dichiarate nel DTD. Le entità elencate devono essere separate da spazi. Ad esempio:
<!-- Nel DTD -->
<!ENTITY lamiaCopertina SYSTEM "lamiaCopertinaDelLibro.jpg" NDATA jpg>
<!ENTITY ilmioAutore SYSTEM "ilmioAutoreDelLibro.jpg" NDATA jpg>
...
<!ATTLIST libro grafica ENTITIES #IMPLIED>
<!-- Nell'XML -->
<libro grafica="lamiaCopertina ilmioAutore">
La descrizione del libro va qui
</libro>
* L'attributo di elenco enumerato può contenere un singolo nome estratto da un elenco di nomi racchiusi fra parentesi. ("Nome" in questo caso indica che i valori dell'elenco devono tutti seguire le stesse convenzioni di assegnazione del nome come elementi XML.)
Per utilizzare un attributo di elenco enumerato, è sufficiente aggiungere alla dichiarazione dell'attributo l'elenco di nomi anziché una parola chiave. Ad esempio, la riga seguente specifica che l'attributo "statoOfferta" dell'elemento <libro> può contenere soltanto "In_offerta" o "Prezzo_normale":
<!ATTLIST libro statoOfferta (In_offerta | Prezzo_normale) #IMPLIED>
* L'attributo ID indica che ciascun elemento deve avere un valore unico (se esiste) per quell'attributo. Ad esempio:
<!-- Nel DTD -->
<!ATTLIST libro codiceLibro ID #REQUIRED>
<!-- Nell'XML -->
<libro codiceLibro="B068157">
La descrizione del libro va qui
</libro>
G L'attributo ID deve avere l'impostazione di default dichiarata #IMPLIED o #REQUIRED. Nessun elemento può avere più di un attributo ID.
* L'attributo IDREF deve "puntare" a un altro elemento del documento XML avente un valore di attributo ID. Ad esempio:
<!-- Nel DTD -->
<!ATTLIST libro codiceLibro ID #REQUIRED>
<!ATTLIST libro catalogatoIn IDREF #REQUIRED>
<!-- Nell'XML -->
<libro codiceLibro="B000321">
Catalogo dei libri sulle erbe aromatiche.
</libro>
<libro codiceLibro="B000123" catalogatoIn="B000321">
Libro sulle erbe aromatiche.
</libro>
* Il valore di un attributo IDREFS consiste di una serie di attributi IDREF separati da spazi.
* Il valore di un attributo NMTOKEN può comprendere vari caratteri, in particolare lettere, numeri, trattini di sottolineatura, punti, e così via, ma non può contenere spazi. L'esempio riportato qui di seguito, quindi, non è valido perché la stringa "Il Mio nome locale" contiene spazi:
<!-- Nel DTD -->
<!ATTLIST libro nomeLocale NMTOKEN #IMPLIED>
<!-- Nell'XML -->
<libro nomeLocale="Il Mio nome locale">
La descrizione del libro va qui
</libro>
* L'attributo NMTOKENS è uguale all'attributo NMTOKEN, ma a differenza di questo specifica che il valore dell'attributo può essere un elenco di NMTOKEN separati da spazi.
<!-- Nel DTD -->
<!ATTLIST libroXML tipoArgomento NMTOKENS #IMPLIED (xml xsl altro)>
<!-- Nell'XML -->
<libroXML tipoArgomento="xml">
La descrizione del libro va qui
</libro>
* L'attributo NOTATION deve contenere uno o più nomi di notazione XML inclusi nel DTD. Ciò permette di creare notazioni che specificano applicazioni di visualizzazione di immagini e di riproduzione di filmati, per poi utilizzare un attributo di elemento per accertarsi che venga utilizzata l'applicazione appropriata per una determinata porzione del contenuto. Ad esempio:
<!-- Nel DTD -->
<!NOTATION jpg SYSTEM " PictureViewer">
<!NOTATION mov SYSTEM "MoviePlayer"
<!ELEMENT elementoMultimediale EMPTY>
<!ATTLIST file elementoMultimediale ENTITY # REQUIRED>
<!ATTLIST elementoMultimediale tipo NOTATION #REQUIRED>
<!-- Nel testo principale XML -->
<file elementoMultimediale="LaMiaFoto.jpg" tipo="jpg"/>
<file elementoMultimediale="LaMiaFoto.mov" tipo="mov"/>
Questa informazione comunica all'applicazione che elabora l'XML che può utilizzare l'applicazione PictureViewer per aprire il file d'immagine, e l'applicazione MoviePlayer per aprire il file del filmato.
G Nessun elemento può avere più di un attributo NOTATION.
* Un attributo NOTATION enumerato deve contenere un elenco racchiuso fra parentesi di uno o più nomi di notazione XML presi dal DTD. Potreste ad esempio creare delle notazioni che specificano svariate applicazioni di visualizzazione di immagini e di riproduzione di filmati e poi usare un attributo di elemento per far sì che venga utilizzato l'insieme di applicazioni appropriato per un dato contenuto. Ecco come si presenterebbe questa soluzione nella pratica:
<!-- Nel DTD -->
<!NOTATION picViewer SYSTEM "PictureViewer">
<!NOTATION photoshop SYSTEM "Photoshop.exe">
<!NOTATION movPlyrMac SYSTEM "MoviePlayer">
<!NOTATION movPlyrWin SYSTEM "Movieplayer.exe">
<!ELEMENT immagine EMPTY>
<!ATTLIST file d'immagine ENTITY #REQUIRED>
<!ATTLIST immagine imageApp NOTATION (picViewer | photoshop) #REQUIRED>
<!ELEMENT filmato EMPTY>
<!ATTLIST file filmato ENTITY #REQUIRED>
<!ATTLIST filmato movieApp NOTATION (movPlyrMac | movPlyrWin) #REQUIRED>
<!-- Nel testo principale XML -->
<file d'immagine="LaMiaImmagine.jpg" imageAPP="picViewer"/>
<filedi filmato="IlMioFilmato.mov" movieApp="movPlyrMac"/>
In questo caso, anziché creare un unico elemento per le immagini e per i filmati, creiamo due elementi distinti <immagine> e <filmato> per ciascuno dei quali il DTD specifica due diverse applicazioni utilizzabili per eseguire il file. La scelta dell'applicazione da usare viene effettuata nel tag del singolo <elemento> nel testo principale del documento XML.
Attributo xml:lang
L'attributo "xml:lang" permette di indicare la lingua utilizzata in un elemento. Questo attributo dovrebbe contenere uno dei codici elencati qui di seguito:
* Un codice di lingua a due lettere definito da ISO 639, eventualmente seguito da un trattino e da un sottotipo (di norma un codice di nazione)
* Un codice di lingua registrato presso lo IANA preceduto dal prefisso "i-" oppure "I-"
* Un codice di lingua definito dall'utente preceduto dal prefisso "x-" o "X-"
G Notate che questi attributi non sono predefiniti, occorre quindi dichiararli prima di poterli utilizzare.
Per indicare la lingua prescelta, è sufficiente utilizzare il relativo codice. Ad esempio, il DTD seguente specifica un elemento "xml:lang" che a sua volta specifica la lingua inglese nel testo principale del documento XML utilizzando il codice ISO 639:
<!-- Nel DTD -->
<!ELEMENT Paragrafo (#PCDATA)>
<!ATTLIST Paragrafo xml:lang NMTOKEN #REQUIRED>
<!-- Nel testo principale XML -->
<Paragrafo xml:lang="en">
I dati del paragrafo vanno qui.
</Paragrafo>
Potete specificare dei sottotipi di lingua aggiungendo un'estensione preceduta da un trattino al nome della lingua. Ad esempio, l'elemento che segue specifica l'inglese internazionale, ovvero quello che si parla in Gran Bretagna, che è diverso dall'inglese americano:
<!-- Nel testo principale XML -->
<Paragrafo xml:lang="en-GB">
I dati del paragrafo vanno qui.
</Paragrafo>
Attributo xml:space
L'attributo "xml:space" permette di indicare all'applicazione che si occupa dell'elaborazione dell'XML che tutto lo spazio bianco relativo a un elemento e ai suoi elementi secondari va lasciato così com'è (a meno che uno degli elementi secondari dell'elemento non reimposti il tag). Ad esempio, il DTD che segue specifica un attributo "xml:space" e l'elemento nel testo principale del documento XML lo imposta su "conserva" per quell'elemento e i suoi elementi secondari:
<!-- Nel DTD -->
<!ELEMENT Paragrafo (#PCDATA)>
<!ATTLIST Paragrafo xml:space (default | conserva) "default">
<!-- Nel testo principale XML -->
<Paragrafo xml:space="conserva">
I dati del paragrafo vanno qui.
Tutto
lo spazio
bianco
conservato.
</Paragrafo>
IGNORE e INCLUDE
Il tag <![IGNORE[]]> consente di comunicare al parser XML di ignorare un tratto di testo di un DTD esterno. Osservate l'esempio seguente:
<-- Questa dichiarazione di elemento viene analizzata come al solito: -->
<!ELEMENT compitoStudente (#PCDATA)>
<![IGNORE[
<-- Questa dichiarazione di elemento viene ignorata dal parser XML: -->
<!ELEMENT notaIstruttore (#PCDATA)>
]]>
Per fare in modo che il parser XML analizzi il testo contenuto nei tag, è sufficiente sostituire IGNORE con INCLUDE, come illustrato dall'esempio seguente:
<-- Questa dichiarazione di elemento viene analizzata come al solito: -->
<!ELEMENT compitoStudente (#PCDATA)>
<![INCLUDE[
<-- Anche questa dichiarazione di elemento viene ora analizzata come al solito: -->
<!ELEMENT notaIstruttore (#PCDATA)>
]]>
Uso dei DTD pubblici
Come abbiamo visto prima, nella dichiarazione DOCTYPE di un documento XML potete fare riferimento a un DTD esterno nel modo seguente:
<?xml version="1.0" standalone="no">
<!-- Il DTD inizia qui -->
<!DOCTYPE ilmioDocumento SYSTEM "ilmiodocumento.dtd">
<!-- Il documento inizia qui -->
<ilmioDocumento>
...
Se state utilizzando un DTD approvato da un organismo quale l'ISO (Organizzazione Internazionale per la Standardizzazione), potete usare un riferimento a entità PUBLIC che specifichi il nome di una copia pubblicamente disponibile del DTD. In tal caso, però, dovete anche fornire l'URL di un file DTD di sistema così che vi sia qualcosa su cui ripiegare se la copia pubblica del DTD non è disponibile.
<?xml version="1.0" standalone="no">
<!-- Il DTD inizia qui -->
<!-- Il primo URL che segue è PUBLIC DTD, il secondo è quello di backup SYTEM DTD -->
<!DOCTYPE docStandard PUBLIC "-//Quark//DTD docStandard 1.0//EN"
"http://www.quark.com/xml/docStandard.dtd">
<!-- Il documento inizia qui -->
<DocStandard>
...
Combinazione di più DTD per creare DTD compositi
Talvolta è consigliabile creare DTD distinti per definire parti diverse di un documento. Ad esempio, la società per cui lavorate potrebbe usare un DTD per tutte le intestazioni e i piè di pagina dei suoi file XML, ma potrebbe invece usare DTD diversi per il testo principale dei documenti prodotti nei vari reparti della società. È possibile gestire situazioni come questa semplicemente creando un unico DTD nuovo che comprenda i vari DTD da utilizzare e che specifichi l'ordine dei loro elementi al livello principale nel modo seguente:
<!ENTITY % intestazioneStandard SYSTEM "intestazioneStandard.dtd">
<!ENTITY % RelazCQ SYSTEM "RelazioneCQ.dtd">
<!ENTITY % pièPaginaStandard SYSTEM "pièPaginaStandard.dtd">
%intestazioneStandard;
%RelazCQ;
%pièPaginaStandard;
<!-- L'elemento al livello principale è <DocRelazCQ> -->
<!ELEMENT DocRelazCQ (intestazioneStandard, RelazCQ, pièPaginaStandard)>
Per i documenti creati con questo DTD <DocRelazCQ> sarebbe l'elemento al livello principale e <intestazioneStandard>, <RelazCQ> ed <pièPaginaStandard> sarebbero i suoi sottoelementi diretti. Un documento che utilizza questa DTD potrebbe avere l'aspetto seguente:
<?xml version="1.0" standalone="no">
<!-- La riga che segue specifica un elemento al livello principale (<DocRelazCQ>) e indica l'URL di un file DTD esterno denominato
"DocRelazCQ.dtd" -->
<!DOCTYPE DocRelazCQ SYSTEM "DocRelazCQ.dtd">
<!-- Il documento inizia qui -->
<DocRelazCQ>
<intestazioneStandard>
<!-- Il contenuto dell'intestazione standard va qui -->
</intestazioneStandard>
<RelazCQ>
<!-- Il contenuto della relazione di CQ va qui -->
</RelazCQ>
<pièPaginaStandard>
<!-- Il contenuto del piè di pagina standard va qui >
</pièPaginaStandard>
</DocRelazCQ>
Modifica locale dei DTD importati
Alcuni flussi di lavoro possono richiedere l'uso di DTD quasi identici per una serie di utilizzi, che però devono essere leggermente modificati per poter essere utilizzati da un determinato reparto o da un particolare gruppo. Non si tratta di un'impresa difficile; è sufficiente includere il DTD nella dichiarazione DOCTYPE, per poi aggiungere qualsiasi dichiarazione di marcatura necessaria al sottogruppo interno.
G Non è possibile ridefinire un elemento già definito nel DTD esterno, ma è possibile ridefinire entità e valori di default per gli attributi.
Convalida di un file XML sulla base di un DTD
Se scrivete i documenti XML con un programma di trattamento del testo, potete leggere il DTD corrispondente e accertarvi di stare seguendo le regole. Ma non potrete essere veramente certi di averle seguite finché non convaliderete il documento XML in base al DTD utilizzando un programma detto parser di convalida. Questo programma legge il DTD ed esamina il file XML per verificare che sia conforme alle regole del DTD. Un buon parser di convalida dovrebbe anche essere in grado di segnalare i problemi eventualmente rilevati.
G Ricordate che se volete verificare la coerenza di un documento XML con un determinato DTD, dovete usare un parser XML di convalida, non un semplice parser XML. Esistono molti parser in grado di indicare se un file XML è ben composto, ma sono molti di meno quelli che segnalano se un file XML è valido.
G Per una guida rapida alle funzionalità e alle convenzioni dei DTD, consultate l'appendice B, "Guida rapida ai DTD", nel Capitolo 7, "Appendici".
DTD standard
Credete sia meglio sviluppare un nuovo DTD personalizzato in base alle esigenze della vostra azienda oppure fareste meglio a usare un DTD standard che, oltre a farvi risparmiare tempo, vi garantisce di poter scambiare informazioni con altre organizzazioni del vostro settore?
Entrambe le soluzioni presentano dei vantaggi. Creando un DTD completamente nuovo, avrete il controllo totale sulla sua struttura e sul processo di aggiornamento. Ciò richiederà tuttavia un investimento significativo in termini di tempo e fatica, e inoltre dovrete fare in modo di prendere in considerazione le esigenze di tutti coloro che lo useranno. Optando per un DTD standard, d'altro canto, potrete risparmiarvi il processo di sviluppo di un DTD di vostra creazione, ma dovrete seguire le convenzioni del DTD che sceglierete e uniformarvi alla struttura da esso definita.
Vantaggi e svantaggi dell'uso di un DTD standard
Se intendete scambiare informazioni con altre organizzazioni, potrebbe essere una buona idea utilizzare un DTD standard. Ciò infatti contribuisce a garantire che lo scambio di informazioni avvenga senza problemi e che le informazioni codificate con tag possano essere riutilizzate in altri contesti. In effetti, questa è una delle ragioni per cui è stato sviluppato il linguaggio XML: aiutare a standardizzare i formati utilizzati per la memorizzazione e lo scambio delle informazioni.
L'utilizzo di un DTD standard presenta tuttavia qualche limite, in quanto è possibile che due organizzazioni abbiano esigenze molto diverse pur se i dati con cui lavorano siano essenzialmente gli stessi. I DTD standard possono comunque essere modificati ai fini del loro utilizzo all'interno di un'organizzazione, ma ciò è abbastanza in contrasto con il loro obiettivo che è quello di garantire che le informazioni vengano memorizzate con un formato coerente fra le organizzazioni.
Posso usare un DTD standard?
I fattori che determinano la possibilità di utilizzare o meno un DTD standard sono numerosi.
Esiste un DTD standard per il settore in cui opera la vostra azienda?
Per trovare la risposta a questa domanda, potete consultare l'elenco dei DTD standard sul Web. Due siti interessanti da questo punto di vista sono www.schema.net e www.xml.org.
Se esiste un DTD standard per il vostro settore, siete certi che risponda alle
vostre esigenze?
Se individuate un DTD standard che sembra andar bene per la vostra organizzazione, esaminatelo a fondo prima di iniziare a usarlo. L'uso di un DTD non adatto può infatti causare seri problemi quali:
* Costringere gli autori del contenuto a utilizzare strutture poco conosciute e inadatte.
* Imporre agli autori del contenuto di confinare i dati entro elementi inappropriati.
* Limitare le possibilità di indicizzazione e ricerca delle informazioni.
* Lasciare troppo spazio di manovra, con il risultato che la marcatura potrebbe venire effettuata in modo errato.
* Rendere più difficoltosa la conversione in altri formati.
* Rendere eccessivamente complesse le applicazioni che elaborano i dati.
* Dover sostenere enormi spese se in definitiva il DTD si rivela inutilizzabile costringendovi a convertire tutti i dati in un altro formato.
Questa domanda merita un'attenta considerazione. Infatti, se il DTD che scegliete non risponde appieno alle vostre esigenze, l'effetto cumulativo di una qualsiasi carenza probabilmente crescerà con il passare del tempo.
Se non esiste ancora un DTD standard per il vostro settore, come potete accertarvi che ce ne sia uno in fase di sviluppo?
Se non riuscite a trovare un DTD standard che soddisfi le esigenze della vostra azienda, può essere una buona idea cercare di scoprire se qualcuno nel vostro settore lo stia sviluppando. In tal caso, la vostra organizzazione potrebbe avere l'opportunità di dare il proprio contributo per lo sviluppo del DTD. La partecipazione allo sviluppo di un DTD standard può infatti aiutarvi a evitare i problemi che potrebbero derivare dall'adozione di un DTD sviluppato da qualcuno che non conosce a fondo le problematiche esistenti nel vostro settore.
Estensione di un DTD standard
Alcune organizzazioni, pur decidendo di adottare un DTD standard, lo modificano per adattarlo alle proprie particolari esigenze. Ad esempio, per adeguare alle proprie specifiche necessità il DTD SGML ISO-standard "libro", la University of California Press vi ha introdotto una serie di modifiche, aggiungendo elementi per la memorizzazione di informazioni quali i sottotitoli dei capitoli e i nomi degli autori dei singoli capitoli. L'ISO fornisce direttive per la modifica dei DTD personalizzati, così che i DTD risultanti da tali modifiche risulteranno comunque in certa misura standardizzati.
Ma cosa succede se dovete scambiare dati con altre organizzazioni che utilizzano il DTD nella sua forma originale non modificata? Alcune organizzazioni decidono di creare delle utilità per convertire i documenti conformi al DTD personalizzato in documenti conformi alla versione originale del DTD. Questa soluzione offre tutti i vantaggi che derivano dall'uso di un DTD personalizzato, consentendovi al tempo stesso di scambiare dati con altre aziende del vostro settore.
Uso di avenue.quark: un esempio pratico
Avenue.quark consente di utilizzare un DTD per estrarre un contenuto strutturato dai documenti QuarkXPress Passport e memorizzarlo nel file system o in una base di dati. La presente sezione illustra l'intero procedimento attraverso un esempio pratico.
La situazione
Immaginate che nella vostra azienda sia stato creato un gran numero di documenti tecnici in formato QuarkXPress Passport e che ora vogliate esportarne il contenuto in formato XML in modo da memorizzarlo in una base di dati e renderlo così accessibile ai vostri clienti attraverso il Web. I documenti tecnici utilizzano tutte gli stessi fogli stile e lo stesso modello QuarkXPress Passport.
1. Creazione o scelta di un DTD
Prima di poter estrarre il contenuto dei documenti tecnici in un formato strutturato, è necessario disporre di una struttura in cui inserire quel contenuto. Il DTD fornisce tale struttura.
G Per ulteriori informazioni sui DTD, consultate la sezione "Come usare i DTD" in questo capitolo.
Esistono due modi per procurarsi un DTD da utilizzare con avenue.quark:
* Scelta di un DTD XML esistente. Già oggi esistono numerosi DTD XML standard e altri saranno disponibili man mano che l'XML viene adottato su scala sempre più ampia. Se optate per questa soluzione, tuttavia, esaminate molto attentamente il DTD che volete utilizzare: un DTD non adatto può creare non pochi problemi agli utenti.
* Sviluppo del vostro DTD. Leggete la sezione "Come usare i DTD" in questo capitolo, quindi analizzate minuziosamente i componenti di un documento tecnico e su tale base sviluppate il vostro DTD. Questo procedimento potrebbe richiedere un investimento significativo in termini di tempo, ma darà i suoi frutti se il DTD che ne risulta è adatto allo scopo. In generale, il DTD viene scelto dai redattori o dal personale amministrativo dell'azienda.
2. Creazione di un documento XML
Create un nuovo documento XML in avenue.quark specificando il DTD che avete scelto precedentemente (punto 1). Tutti gli elementi obbligatori del DTD vengono inseriti automaticamente nel documento XML.
La palette Area di lavoro XML per la creazione di un nuovo documento XML
3. Creazione di un gruppo di regole di codifica
Una delle straordinarie funzionalità di avenue.quark è la codifica con i tag basata su regole. Questo particolare tipo di codifica con tag prevede la creazione di un gruppo di regole di codifica che segnalano ad avenue.quark, ad esempio, che un paragrafo che utilizza il foglio stile "Intestazione" di norma dovrebbe essere contrassegnato con il tag <Titolo>. I gruppi di regole di codifica possono essere utilizzati anche per specificare come devono essere codificati con i tag determinati fogli stile di carattere, colori del testo e stili di formattazione locale. (Per ulteriori informazioni sui gruppi di regole di codifica, consultate il Capitolo 5, "Gruppi di regole di codifica").
4. Salvataggio del documento XML come modello
Salvate il documento XML come modello con il nome "NoteTecniche.xmt". Questo modello contiene il DTD per i documenti tecnici e il gruppo di regole di codifica creato precedentemente (punto 3) e può essere utilizzato per creare tutti i file XML che volete, sullo stesso computer su cui avete fin qui lavorato o su diversi computer.
5. Apertura del documento QuarkXPress Passport da codificare con i tag
6. Creazione di un nuovo documento XML basato sul modello XML per le note tecniche
Quando create un documento XML avenue.quark, la prima cosa da fare è scegliere dall'elenco Modello un modello su cui basare il nuovo documento XML. In questo esempio utilizzeremo il modello "NoteTecniche.xmt" creato in precedenza (punto 4).
Il modello NoteTecniche.xmt facilita la codifica di una nota tecnica
QuarkXPress Passport.
7. Esecuzione della codifica con i tag basata su regole
Per eseguire la codifica con i tag basata su regole, premete Command (Mac OS) oppure Ctrl (Windows) e trascinate la finestra contenente il documento tecnico sull'elemento <noteTecniche> dell'elenco a scorrimento Albero XML. Avenue.quark codificherà automaticamente con i tag il documento, utilizzando le regole del gruppo di regole di codifica.
Per eseguire la codifica con i tag basata su regole, è sufficiente premere Command (Mac OS) o Ctrl (Windows) e trascinare la finestra sull'elemento appropriato dell'elenco Albero XML. Avenue.quark utilizzerà il gruppo di regole di codifica per codificare con i tag la maggior parte possibile del contenuto.
8. Esecuzione della codifica con tag manuale (se necessaria)
Alcuni documenti tecnici potrebbero essere pronti non appena viene terminata la codifica con i tag basata sulle regole. Altri, invece, potrebbero contenere porzioni di testo che devono essere codificate a mano, oppure istanze del testo che potrebbero essere codificate in modi diversi. In questi casi, dovrete semplicemente trascinare il contenuto in questione sull'elemento appropriato della palette Area di lavoro XML.
9. Uso del contenuto strutturato sul Web e altrove
Dopo aver convertito il contenuto dei documenti tecnici nel formato XML, potete usare svariati strumenti per pubblicarlo sul Web. Potete ad esempio renderlo disponibile direttamente come XML per la visualizzazione con uno dei browser più recenti, come ad esempio Microsoft Internet Explorer 5.0. Il contenuto codificato con tag XML può anche essere usato in molti altri modi, in qualunque caso lo riteniate opportuno, ad esempio, per lo scambio elettronico di informazioni, per la produzione di documenti stampati e così via.